home *** CD-ROM | disk | FTP | other *** search
/ Software 2000 / Software 2000 Volume 1 (Disc 1 of 2).iso / education / e121.dms / e121.adf / Source.AMOS / Source.amosSourceCode < prev   
AMOS Source Code  |  1993-01-09  |  26KB  |  1,137 lines

  1. A#=0.0
  2. Auto View Off 
  3. Request On 
  4. On Error Proc CORRECT
  5. Get Fonts 
  6. Dim PUZZLE(320),VFLIP(320),HFLIP(320)
  7. Global P,PUZZLE(),VFLIP(),HFLIP(),Z,X,X1,Y,Y1,TILES,TILES$,XTILES,YTILES,XPIX,YPIX
  8. Global GRAB,PIC,SPACEBAR,LOC1,MKEY,MOVES,MUZAK,MUZAKCHANGE,TIME,AHEAD,VERT,HORIZ,WIN,PIC$,OLD
  9. Global WHOLEMIN,SEC,HOUR,MUSBANK,PCOUNTER,PCOUNT,TIME$,PICTICK,ERR,RES,GO
  10. Global FINSEC,FINWHOLEMIN,FINHOUR,TTIME,OLDTTIME
  11. Proc SETUP
  12. Rem ********* TOP OF OUTER LOOP *************  
  13. TIPPYTOP:
  14. F=Free
  15. GRAB=0
  16. ERR=0
  17. HORIZ=HORIZ*-1
  18. VERT=VERT*-1
  19. TIME=TIME-1
  20. OLD=OLD*-1
  21. PCOUNTER=PCOUNTER-1
  22. MUZAK=MUZAK*-1
  23. MUZAKCHANGE=MUZAKCHANGE*-1
  24. WIN=0
  25. MOVES=0
  26. SEC=0 : WHOLEMIN=0 : HOUR=0
  27. AHEAD=1
  28. Proc FIRSTSCREEN
  29. OLDSTART:
  30. Proc PICLOAD
  31. If ERR=1 Then Goto TIPPYTOP
  32. Change Mouse 3
  33. Show On 
  34. If OLD=-1 Then Proc PRESHUFFLE
  35. If OLD=1 Then OLD=-1
  36. Proc DEFZONES
  37. Proc CUTUP_PIC
  38. Cls 0
  39. Proc SHUFFLE
  40. Double Buffer 
  41. Autoback 0
  42. Bob Update Off 
  43. Screen Show 2
  44. Screen To Front 2
  45. If MUZAK=-1 Then Bell 60
  46. Change Mouse 2
  47. Every 50 Proc CLOCK
  48. Rem ********************* Main Loop
  49. Repeat 
  50.    If Key State(76)=True and Y Hard(2,0)>=29 Then Proc MOVE_SCREEN[2,,-2]
  51.    If Key State(77)=True and Y Hard(2,0)<=297 Then Proc MOVE_SCREEN[2,,2]
  52.    If Key State(95) Then Proc SEEPIC
  53.    If Key State(84) Then Proc PICDO : Goto TIPPYTOP
  54.    If Key State(89) Then Proc ILLBEBACK
  55.    If Key State(69) Then Proc WHICHKEYS
  56.    If Key State(55) Then Proc MUZAKMENU
  57.    If Key State(80)=True Then Proc FINISH : Goto TIPPYTOP
  58.    If OLD=1 Then Goto OLDSTART
  59.    Screen Swap : Wait Vbl 
  60.    Bob Clear 
  61.    If Mouse Click>0
  62.       MKEY=Mouse Key
  63.       If GRAB=1
  64.          If Key State(64) and MKEY=1
  65.             SPACEBAR=1
  66.          End If 
  67.       End If 
  68.       If GRAB=0
  69.          Inc MOVES
  70.          Proc GRABTILE
  71.       Else Proc TILEPASTE
  72.       End If 
  73.    End If 
  74.    Bob Draw 
  75.    Screen Swap : Wait Vbl 
  76.    Bob Clear 
  77.    Screen Copy Physic To Logic
  78.    Bob Draw 
  79. Until WIN>0
  80. If WIN=1
  81.    If TIME=0 and TTIME<=0
  82.       Proc OUTOFTIME
  83.    Else 
  84.       Proc FINISH
  85.    End If 
  86. End If 
  87. Goto TIPPYTOP
  88. Rem ******************** end of main loop
  89. End 
  90. Procedure PRESHUFFLE
  91.    Randomize Timer
  92.    For A=1 To TILES : PUZZLE(A)=0 : VFLIP(A)=0 : HFLIP(A)=0 : Next 
  93.    For A=1 To TILES
  94.       RETRY:
  95.       Q=Rnd(TILES-1)+1
  96.       If PUZZLE(Q)=0 Then PUZZLE(Q)=A Else Goto RETRY
  97.       F=Rnd(1)+1 : If VERT=1 and F>1 Then VFLIP(Q)=-1 Else VFLIP(Q)=1
  98.       F=Rnd(1)+1 : If HORIZ=1 and F>1 Then HFLIP(Q)=-1 Else HFLIP(Q)=1
  99.    Next A
  100. End Proc
  101. Procedure DEFZONES
  102.    Screen 0
  103.    Reserve Zone 
  104.    Reserve Zone TILES+1
  105.    P=0
  106.    For C=0 To YTILES-1
  107.       For B=0 To XTILES-1
  108.          Inc P
  109.          Set Zone P,B*XPIX,C*YPIX To XPIX+(B*XPIX),YPIX+(C*YPIX)
  110.       Next 
  111.    Next 
  112. End Proc
  113. Procedure CUTUP_PIC
  114.    P=0
  115.    For C=0 To YTILES-1
  116.       For B=0 To XTILES-1
  117.          Inc P
  118.          Screen 1
  119.          Get Block P,B*XPIX,C*YPIX,XPIX,YPIX
  120.       Next 
  121.    Next 
  122. End Proc
  123. Procedure SHUFFLE
  124.    Rem display completed tiles
  125.    Screen Hide 1
  126.    Screen 1
  127.    Cls 0
  128.    P=0
  129.    For C=0 To YTILES-1
  130.       For B=0 To XTILES-1
  131.          Inc P
  132.          Put Block P,B*XPIX,C*YPIX
  133.       Next 
  134.    Next 
  135.    Wait 321-TILES
  136.    Rem display shuffled tiles 
  137.    Screen To Front 0
  138.    Screen 0
  139.    P=0
  140.    For C=0 To YTILES-1
  141.       For B=0 To XTILES-1
  142.          Inc P
  143.          If VFLIP(P)=-1
  144.             Vrev Block PUZZLE(P)
  145.          End If 
  146.          If HFLIP(P)=-1
  147.             Hrev Block PUZZLE(P)
  148.          End If 
  149.          Put Block PUZZLE(P),B*XPIX,C*YPIX
  150.       Next 
  151.    Next 
  152.    Screen 0
  153.    Limit Mouse X Hard(2),Y Hard(1) To X Hard((320*RES)-2),Y Hard(255)
  154.    Screen Show 1
  155. End Proc
  156. Procedure GRABTILE
  157.    If MKEY=1
  158.       Inc GRAB
  159.       LOC1=Mouse Zone
  160.       Y=Int(Y Screen(Y Mouse)) : X=(X Screen(X Mouse))
  161.       X1=Int(X/XPIX)*XPIX
  162.       Y1=Int(Y/YPIX)*YPIX
  163.       Get Bob 6,X1,Y1 To XPIX+X1,YPIX+Y1
  164.       No Mask 6
  165.       Hot Spot 6,$11
  166.       Channel 6 To Bob 6
  167.       Bob 6,X,Y,6
  168.       A$=A$+"Update:Let X=XS(0,XM);Let Y=YS(0,YM);Pause;Jump Update"
  169.       Amal 6,A$
  170.       Amal On 
  171.    End If 
  172.    MKEY=0
  173. End Proc
  174. Procedure TILEPASTE
  175.    X2=X1 : Y2=Y1
  176.    LOC2=Mouse Zone
  177.    Swap PUZZLE(LOC1),PUZZLE(LOC2)
  178.    Swap VFLIP(LOC1),VFLIP(LOC2)
  179.    Swap HFLIP(LOC1),HFLIP(LOC2)
  180.    Y=Int(Y Screen(Y Mouse)) : X=(X Screen(X Mouse))
  181.    X1=Int(X/XPIX)*XPIX
  182.    Y1=Int(Y/YPIX)*YPIX
  183.    Bob Clear 
  184.    Get Bob 7,X1,Y1 To XPIX+X1,YPIX+Y1
  185.    No Mask 7
  186.    Paste Bob X2,Y2,7
  187.    If MKEY=2 and VERT=1 Then VFLIP(LOC2)=VFLIP(LOC2)*-1 : Vrev Block PUZZLE(LOC2) : IMAGE=IMAGE+$4000
  188.    If SPACEBAR=1 and MKEY=1 and HORIZ=1 Then HFLIP(LOC2)=HFLIP(LOC2)*-1 : Hrev Block PUZZLE(LOC2) : SPACEBAR=0 : IMAGE=IMAGE+$8000
  189.    Paste Bob X1,Y1,IMAGE+6
  190.    Bob Off 
  191.    Amal Freeze 
  192.    GRAB=0 : MKEY=0
  193.    Proc CHECK_FINISH
  194. End Proc
  195. Procedure SEEPIC
  196.    Inc PIC
  197.    Hide On 
  198.    If PIC>1
  199.       PIC=0 : Show On 
  200.    End If 
  201.    If PCOUNT>0
  202.       Screen To Front PIC
  203.       If PIC=0
  204.          Screen To Front 2
  205.       End If 
  206.    Else 
  207.       Screen 1 : Colour 0,$0 : Cls 0
  208.       Colour 2,$FFF
  209.       Ink 2,0
  210.       Set Font 3
  211.       Gr Writing 1
  212.       C$="SORRY!"
  213.       If RES=1
  214.          Text 118*RES,110,C$
  215.       End If 
  216.       If RES=2
  217.          Text 142*RES,110,C$
  218.       End If 
  219.       Set Font 1
  220.       Gr Writing 0
  221.       Screen To Front PIC
  222.    End If 
  223.    If PIC=0 Then Dec PCOUNT
  224.    STILLPRESSED:
  225.    If Key State(95)=True Then Goto STILLPRESSED
  226. End Proc
  227. Procedure MOVE_SCREEN[S,DX,DY]
  228.    Rem get hardware coordinates of top left corner of screen s
  229.    Rem x coordinate 
  230.    SX=X Hard(S,0)
  231.    Rem if sx goes weird, reset to default position
  232.    If SX<112 Then SX=128
  233.    Rem get y coordinate 
  234.    SY=Y Hard(S,0)
  235.    Rem if y hard gives a strange result, reset to 50
  236.    If SY<0 Then SY=50
  237.    Rem move screen to new position
  238.    Screen Display S,SX+DX,SY+DY,,
  239.    DY=0
  240. End Proc
  241. Procedure PICDO
  242.    Every Off 
  243.    Hide On 
  244.    WIN=2
  245.    Bob Clear 
  246.    Screen Copy 0 To 1
  247.    Screen 1
  248.    Screen To Front 1
  249.    For A=1 To TILES
  250.       Q=PUZZLE(A)
  251.       If VFLIP(A)=-1 Then Vrev Block PUZZLE(A)
  252.       If HFLIP(A)=-1 Then Hrev Block PUZZLE(A)
  253.       YPOS=Int(Q-1)/XTILES
  254.       XPOS=Int(Q-1) mod XTILES
  255.       Put Block PUZZLE(A),XPOS*XPIX,YPOS*YPIX
  256.       For N=1 To 350 : Next 
  257.    Next 
  258.    Screen 0
  259.    Cls 0
  260.    Screen Swap : Wait Vbl 
  261.    Cls 0
  262.    Screen Swap : Wait Vbl 
  263.    Screen 2
  264.    Cls 0
  265.    Flash 0,"(f00,50)(aa0,50)"
  266.    Pen 3 : Paper 0
  267.    Locate 15,0
  268.    Print "Hard luck!  Why not try again on an easier level?";
  269.    Screen To Front 2
  270.    If MUZAK=-1
  271.       For W=9 To 1 Step -1
  272.          Bell W
  273.          Wait 4
  274.       Next 
  275.    End If 
  276.    Do 
  277.       If Mouse Click=1 Then Exit 
  278.       Screen 1
  279.    Loop 
  280.    Screen 0
  281.    Screen Close 2
  282.    Fade 1 : Wait 16
  283.    Clear Key 
  284. End Proc
  285. Procedure PICLOAD
  286.    On Error Proc CORRECT
  287.    Proc MUZAKPLAY
  288.    If OLD=1
  289.       Proc FILELOAD
  290.    End If 
  291.    HEREUARE:
  292.    Screen Open 3,640,256,2,Hires
  293.    Curs Off 
  294.    Proc MOVE_SCREEN[3,0,-4]
  295.    Set Rainbow 0,1,280,"","","(9,1,15)(9,-1,15)"
  296.    Rainbow 0,0,40,280
  297.    PICK_A_PIC:
  298.    Inc PICTICK
  299.    If PICTICK=1
  300.       PIC$="called "+PIC$
  301.    End If 
  302.    If OLD=1
  303.       PIC$=PIC$
  304.    Else PIC$=""
  305.    End If 
  306.    Clear Key 
  307.    '   Dir$="sys:Pictures/" 
  308.    F$=Fsel$("Sys:Pictures/","","Pick a Picture for your puzzle",PIC$)
  309.    If F$=""
  310.       OLD=-1 : ERR=1 : Pop Proc
  311.    End If 
  312.    If Exist(F$)=False
  313.       Goto PICK_A_PIC
  314.    End If 
  315.    If OLD=1
  316.       T=Instr(PIC$,F$)
  317.       If T=0
  318.          Goto PICK_A_PIC
  319.       End If 
  320.    End If 
  321.    Rainbow Del 0
  322.    Wait 1
  323.    Palette $0,$FFF
  324.    Cls 0
  325.    Pen 1 : Paper 0
  326.    Locate 32,15
  327.    Print "Loading picture..."
  328.    Load Iff F$,1
  329.    If Screen<>1
  330.       Bell 40
  331.       Cls 
  332.       Locate 28,15
  333.       Print "Unable to load picture"
  334.       Locate 15,17
  335.       Print "Press left mouse key to load a different picture"
  336.       Do 
  337.          If Mouse Key=1
  338.             Exit 
  339.          End If 
  340.       Loop 
  341.       Goto HEREUARE
  342.    End If 
  343.    Screen Hide 1
  344.    Hide On 
  345.    Proc MOVE_SCREEN[1,0,-4]
  346.    PICTICK=0
  347.    Screen Close 3
  348.    Proc SIZE
  349.    PIC$=F$
  350.    W=Screen Width
  351.    COUL=Screen Colour
  352.    If W>430
  353.       W=640
  354.       Screen Open 0,W,256,COUL,Hires
  355.    End If 
  356.    If W<=430
  357.       W=320
  358.       Screen Open 0,W,256,COUL,Lowres
  359.    End If 
  360.    Limit Mouse X Hard(2),Y Hard(1) To X Hard((320*RES)-2),Y Hard(255)
  361.    Curs Off 
  362.    Screen Hide 0
  363.    Proc MOVE_SCREEN[0,0,-4]
  364.    If PCOUNTER<>0 Then Screen Copy 1 To 0
  365.    Get Palette 1
  366.    Flash Off 
  367.    Colour Back 0
  368.    Screen Open 2,640,8,4,Hires
  369.    Screen Hide 2
  370.    Proc MOVE_SCREEN[2,0,246]
  371.    Flash Off 
  372.    Colour 0,$337 : Colour 1,$B00 : Colour 3,$FF0
  373.    Curs Off 
  374.    Cls 0
  375.    Paper 0
  376.    If VERT=-1 Then VFLIP$="V Flip: Off" Else VFLIP$="V Flip: On"
  377.    If HORIZ=-1 Then HFLIP$="H Flip: Off" Else HFLIP$="H Flip: On"
  378.    Locate 0,0
  379.    If TIME=0
  380.       WIN=-1
  381.       Inc TTIME
  382.       Print "Time Left  ";
  383.       Proc CLOCK
  384.       WIN=0
  385.    End If 
  386.    If TIME=1 Then Print "Time Taken  00:00:00";
  387.    If TIME=2 Then Print "Clock Time  ";
  388.    Screen 2
  389.    Locate 24,0 : Print "Move No. 0";
  390.    If PCOUNT>-1 and PCOUNT<6
  391.       Locate 38,0
  392.       Pen 3
  393.       Print PCOUNT;
  394.       Pen 2
  395.    End If 
  396.    Locate 43,0
  397.    Print TILES;" Tiles";
  398.    Locate 54,0 : Print HFLIP$;
  399.    Locate 68,0 : Print VFLIP$;
  400.    Screen Show 1
  401.    Screen Show 0
  402.    Screen 0
  403.    Limit Mouse X Hard(2),Y Hard(1) To X Hard((320*RES)-2),Y Hard(255)
  404. End Proc
  405. Procedure SETUP
  406.    Erase 7
  407.    HORIZ=-1
  408.    VERT=-1
  409.    OLD=-1
  410.    TIME=-1
  411.    PCOUNTER=-1
  412.    MUZAK=-1
  413.    MUZAKCHANGE=1
  414.    TILES=40
  415.    TILES$=" 40"
  416.    Change Mouse 2
  417.    Curs Off : Flash Off 
  418. End Proc
  419. Procedure CHECK_FINISH
  420.    For A=1 To TILES
  421.       If PUZZLE(A)=A and VFLIP(A)=1 and HFLIP(A)=1 Then Inc CHECK
  422.    Next 
  423.    If CHECK=TILES Then WIN=1
  424. End Proc
  425. Procedure FINISH
  426.    Every Off 
  427.    Bob Clear 
  428.    Hide On 
  429.    If MUZAK=1 Then Track Stop 
  430.    Screen 2
  431.    Cls 0
  432.    Flash 0,"(f00,50)(aa0,50)"
  433.    Pen 3
  434.    If TIME=1
  435.       Locate 8,0
  436.       Print "Time Taken ";TIME$;
  437.    End If 
  438.    Locate 31,0
  439.    Print "PICTURE COMPLETED";
  440.    Locate 50,0
  441.    If MOVES=1
  442.       Print "in";Str$(MOVES);" Move";
  443.    Else 
  444.       Print "in";Str$(MOVES);" Moves";
  445.    End If 
  446.    Wait 15
  447.    Music 1
  448.    Wait 300
  449.    Music Off 
  450.    Screen Close 1
  451.    STILLPRESSED:
  452.    If Key State(80)=True Then Goto STILLPRESSED
  453.    Do 
  454.       If Mouse Click=1 Then Exit 
  455.    Loop 
  456.    If MUZAK=1 Then Track Play 
  457.    Screen Close 2
  458.    Fade 1 : Wait 16
  459.    Screen Close 0
  460.    WIN=1
  461.    Clear Key 
  462. End Proc
  463. Procedure FIRSTSCREEN
  464.    Clear Key 
  465.    Screen Open 0,640,256,16,Hires
  466.    Screen Hide 0
  467.    Curs Off 
  468.    Screen Open 1,320,200,32,Lowres
  469.    Screen Hide 1
  470.    Proc MOVE_SCREEN[1,0,-4]
  471.    Unpack 8 To 1
  472.    Auto View On 
  473.    Hide On 
  474.    Change Mouse 2
  475.    Screen 0
  476.    Colour 4,$C00 : Colour 5,$292 : Colour 3,$E70
  477.    Curs Off 
  478.    Flash Off 
  479.    Set Rainbow 0,1,280,"","","(9,1,15)(9,-1,15)"
  480.    Rainbow 0,0,38,280
  481.    Limit Mouse 140,60 To 440,280
  482.    X Mouse=200 : Y Mouse=100
  483.    Ink 5
  484.    Set Font 3
  485.    T$="PICTURE PUZZLE - OPTIONS"
  486.    Text 165,39,T$
  487.    Set Font 1
  488.    Ink 2
  489.    HERE:
  490.    Reserve Zone 9
  491.    Z=0
  492.    Restore L
  493.    For N=1 To 8
  494.       Inc Z
  495.       If Z>4 Then M=320 Else M=Z
  496.       Read M$
  497.       Gr Writing 0
  498.       If Z>4
  499.          Set Zone Z,M+215,((Z-4)*32)+32 To M+254,56+((Z-4)*32)
  500.          X=50*8 : Y=46+((Z-4)*4*8)
  501.       Else 
  502.          Set Zone Z,M+214,(Z*32)+32 To M+253,56+(Z*32)
  503.          X=40 : Y=46+(Z*32)
  504.       End If 
  505.       Text X,Y,M$
  506.       Paper 4
  507.       If Z=1 Then TILES$=TILES$ : TILES=Val(TILES$)
  508.       Proc BUTTONPRINT
  509.    Next 
  510.    L: Data "PUZZLE PIECES","HORIZONTAL FLIPS","VERTICAL FLIPS","LOAD SAVED PUZZLE","STOPWATCH","MUSIC ","CHANGE MUSIC","PICTURE COUNTER"
  511.    Paper 0
  512.    Z=9
  513.    Proc BUTTONPRINT
  514.    Set Zone 9,296,(224)-8 To 376,16+(224)
  515.    If GO=0
  516.       Music 1 : Wait 230
  517.       GO=1
  518.    Else 
  519.       Do 
  520.          If Mouse Key=1
  521.             Exit 
  522.          End If 
  523.       Loop 
  524.    End If 
  525.    Screen 1
  526.    Fade 1 : Wait 15
  527.    Screen Show 0
  528.    Show On 
  529.    Screen 0
  530.    Screen To Front 0
  531.    Screen Close 1
  532.    If GO=1 Then Wait 20 : Music Off 
  533.    HERE1:
  534.    Do 
  535.       If Mouse Click=1 and Mouse Zone>0 Then Exit 
  536.    Loop 
  537.    Z=Mouse Zone
  538.    If Z=1
  539.       Read TILES$
  540.       TILES=Val(TILES$)
  541.       If TILES=320
  542.          Restore TIL
  543.       End If 
  544.       TIL: Data " 4 "," 8 "," 20"," 40"," 80","160","320"
  545.    End If 
  546.    Proc BUTTONPRINT
  547.    If Z=6
  548.       If MUZAK=-1
  549.          Track Stop 
  550.       Else 
  551.          If MUZAK=1 and MUSBANK=1
  552.             Track Play 
  553.          End If 
  554.       End If 
  555.    End If 
  556.    If Z=9
  557.       If OLD=-1
  558.          OLDTTIME=0
  559.       End If 
  560.       Proc TILESDATA
  561.       Proc TIMECALC
  562.       Wait 25 : Screen 0 : Fade 1 : Wait 15
  563.       Reserve Zone 
  564.       Screen Close 0
  565.       Rainbow Del 0
  566.       Pop Proc
  567.    End If 
  568.    Goto HERE1
  569.    Wait Key 
  570. End Proc
  571. Procedure BUTTONPRINT
  572.    Shared M
  573.    Screen 0
  574.    If Z=2 Then HORIZ=HORIZ*-1 : BUTTON=HORIZ
  575.    If Z=3 Then VERT=VERT*-1 : BUTTON=VERT
  576.    If Z=4 Then OLD=OLD*-1 : BUTTON=OLD
  577.    If Z=6 Then MUZAK=MUZAK*-1 : BUTTON=MUZAK
  578.    If Z=7 and MUZAK=1 Then MUZAKCHANGE=MUZAKCHANGE*-1 : BUTTON=MUZAKCHANGE
  579.    If Z=9 Then AHEAD=AHEAD*-1 : BUTTON=AHEAD
  580.    If Z=8
  581.       Inc PCOUNTER
  582.       If PCOUNTER=6
  583.          PCOUNTER=-1
  584.       End If 
  585.       PCOUNT=PCOUNTER
  586.       If PCOUNTER=-1
  587.          PCOUNT=9999
  588.       End If 
  589.    End If 
  590.    If Z=5
  591.       Inc TIME
  592.       If TIME>2
  593.          TIME=-1
  594.       End If 
  595.       BUTTON=TIME
  596.    End If 
  597.    If Z>1 and Z<8
  598.       If BUTTON=1
  599.          BUTTON$="YES" : Paper 4
  600.       Else BUTTON$="OFF" : Paper 6
  601.       End If 
  602.    End If 
  603.    If Z=5
  604.       If BUTTON=0
  605.          BUTTON$="DEC" : Paper 0
  606.       End If 
  607.       If BUTTON=1
  608.          BUTTON$="INC" : Paper 4
  609.       End If 
  610.       If BUTTON=2
  611.          BUTTON$="CLK" : Paper 5
  612.       End If 
  613.    End If 
  614.    If Z=8
  615.       If PCOUNTER>-1 and PCOUNTER<6
  616.          Paper 5 : BUTTON$=Str$(PCOUNTER)+" "
  617.          If PCOUNTER=0
  618.             Paper 0
  619.          End If 
  620.       End If 
  621.       If PCOUNTER=-1
  622.          Paper 6 : BUTTON$="OFF"
  623.       End If 
  624.    End If 
  625.    If Z=9
  626.       If BUTTON=1
  627.          Paper 5 : BUTTON$=" PROCEED"
  628.       Else Paper 3 : BUTTON$=" HIT ME "
  629.       End If 
  630.    End If 
  631.    If Z=1
  632.       Paper 5
  633.       BUTTON$=Right$(TILES$,3)
  634.    End If 
  635.    If Z>4
  636.       Locate 68,((Z-4)*4)+5
  637.    Else Locate 28,(Z*4)+5
  638.    End If 
  639.    If Z=9
  640.       Locate 38,28
  641.    End If 
  642.    Print Border$(BUTTON$,2)
  643.    If Z=6 and MUZAK=-1
  644.       MUZAKCHANGE=-1
  645.       BUTTON$="OFF"
  646.       Locate 68,((Z-3)*4)+5
  647.       Print Border$(BUTTON$,2)
  648.    End If 
  649. End Proc
  650. Procedure TILESDATA
  651.    If TILES=4 Then XTILES=2 : YTILES=2 : XPIX=160*RES : YPIX=128
  652.    If TILES=8 Then XTILES=4 : YTILES=2 : XPIX=80*RES : YPIX=128
  653.    If TILES=20 Then XTILES=5 : YTILES=4 : XPIX=64*RES : YPIX=64
  654.    If TILES=40 Then XTILES=10 : YTILES=4 : XPIX=32*RES : YPIX=64
  655.    If TILES=80 Then XTILES=10 : YTILES=8 : XPIX=32*RES : YPIX=32
  656.    If TILES=160 Then XTILES=20 : YTILES=8 : XPIX=16*RES : YPIX=32
  657.    If TILES=320 Then XTILES=20 : YTILES=16 : XPIX=16*RES : YPIX=16
  658. End Proc
  659. Procedure CLOCK
  660.    If TIME=2 Then Goto HERE
  661.    If TIME=0
  662.       Dec TTIME : Inc OLDTTIME
  663.       If TTIME=0
  664.          WIN=1 : Pop Proc
  665.       End If 
  666.    End If 
  667.    If WIN=0 Then Inc SEC
  668.    If SEC>59 Then Inc WHOLEMIN : SEC=0
  669.    If WHOLEMIN>59 Then Inc HOUR : WHOLEMIN=0 : SEC=0
  670.    '
  671.    Dec FINSEC
  672.    If FINSEC<0 Then Dec FINWHOLEMIN : FINSEC=59
  673.    If FINWHOLEMIN<0 Then Dec FINHOUR : FINWHOLEMIN=59 : FINSEC=59
  674.    '
  675.    If TIME=0 Then GENERICHOUR=FINHOUR Else GENERICHOUR=HOUR
  676.    If TIME=0 Then GENERICWHOLEMIN=FINWHOLEMIN Else GENERICWHOLEMIN=WHOLEMIN
  677.    If TIME=0 Then GENERICSEC=FINSEC Else GENERICSEC=SEC
  678.    HOUR$=Right$(Str$(GENERICHOUR),Len(Str$(GENERICHOUR))-1) : If Len(HOUR$)<2 Then HOUR$="0"+HOUR$
  679.    WHOLEMIN$=Right$(Str$(GENERICWHOLEMIN),Len(Str$(GENERICWHOLEMIN))-1) : If Len(WHOLEMIN$)<2 Then WHOLEMIN$="0"+WHOLEMIN$
  680.    SEC$=Right$(Str$(GENERICSEC),Len(Str$(GENERICSEC))-1) : If Len(SEC$)<2 Then SEC$="0"+SEC$
  681.    Screen 2
  682.    Paper 0
  683.    If TIME>-1
  684.       Locate 12,0
  685.       TIME$=HOUR$+":"+WHOLEMIN$+":"+SEC$
  686.       Print TIME$;
  687.    End If 
  688.    HERE:
  689.    If TIME=2
  690.       Proc _TIME$
  691.       Screen 2
  692.       Locate 12,0 : Print TIME$;
  693.    End If 
  694.    Locate 24,0
  695.    Print "Move No.";MOVES;
  696.    If PCOUNT<6 and PCOUNT>-1
  697.       Pen 3
  698.       Locate 38,0
  699.       Print PCOUNT;
  700.       Pen 2
  701.    End If 
  702.    Screen 0
  703.    If WIN=0 Then Every On 
  704. End Proc
  705. Procedure _TIME$
  706.    '
  707.    ' Call DOS function
  708.    T$=Space$(12)
  709.    Dreg(1)=Varptr(T$)
  710.    RIEN=Doscall(-192)
  711.    MN=Leek(Varptr(T$)+4)
  712.    SEC=Leek(Varptr(T$)+8)
  713.    '
  714.    ' Minutes calculation
  715.    H=MN/60 : H$=Mid$(Str$(H),2) : If Len(H$)<2 : H$="0"+H$ : End If 
  716.    M=MN mod 60 : M$=Mid$(Str$(M),2) : If Len(M$)<2 : M$="0"+M$ : End If 
  717.    '
  718.    ' Seconds calculation  
  719.    S=SEC/50 : S$=Mid$(Str$(S),2) : If Len(S$)<2 : S$="0"+S$ : End If 
  720.    '
  721.    ' Final string 
  722.    TIME$=H$+":"+M$+":"+S$
  723.    '
  724. End Proc[TIME$]
  725. Procedure ILLBEBACK
  726.    On Error Proc CORRECT
  727.    Rem Check o.k. 
  728.    Every Off 
  729.    STILLPRESSED:
  730.    If Key State(89) Then Goto STILLPRESSED
  731.    Clear Key 
  732.    If MUZAK=-1 Then Bell 
  733.    Screen 2
  734.    Colour 0,$B00
  735.    Get Block 321,0,0,640,8
  736.    FILESTOP:
  737.    Screen 2
  738.    Cls 1
  739.    Paper 1
  740.    Locate 0,0
  741.    Pen 3 : Print "Press:";
  742.    Pen 3 : Print "        S"; : Pen 2 : Print " (SAVE Puzzle) ";
  743.    Pen 3 : Print "        F10"; : Pen 2 : Print " (RETURN To Puzzle)";
  744.    THERE:
  745.    If Key State(89)
  746.       Cls 
  747.       Locate 22,0 : Print "Returning to puzzle....";
  748.       Wait 75
  749.       If MUZAK=-1
  750.          Bell 
  751.       End If 
  752.       Colour 0,$337
  753.       Cls 0
  754.       Paper 0
  755.       Put Block 321,0,0
  756.       Screen 0
  757.       Limit Mouse X Hard(2),Y Hard(1) To X Hard((320*2)-2),Y Hard(255)
  758.       Every On 
  759.       Pop Proc
  760.    End If 
  761.    If Key State(33)
  762.       Cls 
  763.       Locate 0,0
  764.       Paper 1
  765.       Print "Press any key to save the file...";
  766.       Wait Key 
  767.       Cls 
  768.       Clear Key 
  769.       Screen Open 3,320,256,2,Lowres
  770.       Proc MOVE_SCREEN[3,0,-4]
  771.       Set Rainbow 0,1,280,"","","(9,1,15)(9,-1,15)"
  772.       Rainbow 0,0,40,280
  773.       FILESAVE:
  774.       Dir$="df0:"
  775.       F$=Fsel$("*.picpuz","","Save a Puzzle","Choose a name.")
  776.       If F$=""
  777.          Rainbow Del 0
  778.          Screen Close 3
  779.          Goto FILESTOP
  780.       End If 
  781.       If Right$(F$,6)<>".picpuz"
  782.          Goto THERE2
  783.       End If 
  784.       F$=F$+".picpuz"
  785.       THERE2:
  786.       If Exist(F$)=True
  787.          Kill F$
  788.       End If 
  789.       Open Out 1,F$
  790.       Print #1,TILES
  791.       Print #1,TILES$
  792.       Print #1,MOVES
  793.       Print #1,PCOUNTER
  794.       Print #1,PCOUNT
  795.       Print #1,TIME
  796.       Print #1,OLDTTIME
  797.       Print #1,VERT
  798.       Print #1,HORIZ
  799.       Print #1,SEC
  800.       Print #1,WHOLEMIN
  801.       Print #1,HOUR
  802.       Print #1,PIC$
  803.       For A=1 To TILES
  804.          Print #1,PUZZLE(A)
  805.          Print #1,VFLIP(A)
  806.          Print #1,HFLIP(A)
  807.       Next 
  808.       Close 1
  809.       Screen 2
  810.       Clear Key 
  811.       Print "File Saved. Press any key to continue...";
  812.       Wait Key 
  813.       Rainbow Del 0
  814.       Screen Close 3
  815.       Goto FILESTOP
  816.    End If 
  817.    Goto THERE
  818. End Proc
  819. Procedure WHICHKEYS
  820.    Every Off 
  821.    STILLPRESSED:
  822.    If Key State(69)=True Then Goto STILLPRESSED
  823.    Screen 2
  824.    If MUZAK=-1 Then Bell : Wait 10
  825.    Get Block 321,0,0,640,8
  826.    Do 
  827.       Colour 0,$B00
  828.       Cls 0
  829.       Paper 0
  830.       Locate 0,0
  831.       Pen 3
  832.       Print " KEYS:  "; : Pen 3 : Print "F1"; : Pen 2 : Print " (Finished)";
  833.       Pen 3 : Print "  F5 "; : Pen 2 : Print "(Quit)";
  834.       Pen 3 : Print "  SPACE"; : Pen 2 : Print " (H Flip)";
  835.       Pen 3 : Print "  Right Mouse Button "; : Pen 2 : Print "(V Flip)";
  836.       For N=1 To 155
  837.          If Key State(69) Then N=175 : Goto HERE
  838.          Wait 1
  839.       Next 
  840.       Cls 
  841.       Locate 0,0
  842.       Pen 3 : Print " KEYS:";
  843.       Pen 3 : Print "  Help"; : Pen 2 : Print " (View Pic.)";
  844.       Pen 3 : Print "  F10"; : Pen 2 : Print " (Save Puzzle)";
  845.       Pen 3 : Print "  M"; : Pen 2 : Print " (Music)";
  846.       Pen 3 : Print "  Esc "; : Pen 2 : Print "(Return To PUZZLE)";
  847.       For N=1 To 155
  848.          If Key State(69) Then N=175 : Goto HERE
  849.          Wait 1
  850.       Next 
  851.       If Key State(69) Then Exit 
  852.       Cls 
  853.       Locate 0,0
  854.       Pen 3 : Print " KEYS:";
  855.       Pen 3 : Print " Cursor Keys  "; : Pen 2 : Print " (Vertically moves this information panel)";
  856.       For N=1 To 155
  857.          If Key State(69) Then N=175 : Goto HERE
  858.          Wait 1
  859.       Next 
  860.       If Key State(69) Then Exit 
  861.       Cls 
  862.       Locate 0,0
  863.       Print "                    Press the "; : Pen 3 : Print "Esc"; : Pen 2 : Print " key before using any other key";
  864.       For N=1 To 155
  865.          If Key State(69) Then N=150 : Goto HERE
  866.          Wait 1
  867.       Next 
  868.       If Key State(69) Then Exit 
  869.    Loop 
  870.    HERE:
  871.    STILLPRESSED1:
  872.    If Key State(69)=True Then Goto STILLPRESSED1
  873.    Colour 0,$337
  874.    Cls 0
  875.    Paper 0
  876.    Put Block 321,0,0
  877.    If MUZAK=-1 Then Bell 
  878.    Screen 0
  879.    Limit Mouse X Hard(2),Y Hard(1) To X Hard((320*RES)-2),Y Hard(255)
  880.    Every On 
  881. End Proc
  882. Procedure MUZAKPLAY
  883.    If MUZAKCHANGE=1 or MUZAK=1 and MUSBANK=0
  884.       Screen Open 3,640,256,2,Hires
  885.       Proc MOVE_SCREEN[3,0,-4]
  886.       Curs Off 
  887.       Set Rainbow 0,1,280,"","","(9,1,15)(9,-1,15)"
  888.       Rainbow 0,0,40,280
  889.       On Error Proc CORRECT
  890.       MUSAKLOAD:
  891.       Clear Key 
  892.       Dir$="sys:modules/"
  893.       F$=Fsel$("*.*","","Select NoiseTracker Module","to listen to")
  894.       If F$=""
  895.          Rainbow Del 0
  896.          Screen Close 3
  897.          If Length(7)=0
  898.             MUZAK=-1 : MUSBANK=0
  899.          Else MUZAK=1 : MUSBANK=1
  900.          End If 
  901.          Pop Proc
  902.       End If 
  903.       If Exist(F$)=False
  904.          Goto MUSAKLOAD
  905.       End If 
  906.       If MUZAKCHANGE=1
  907.          MUZAKCHANGE=-1
  908.       End If 
  909.       Rainbow Del 0
  910.       Wait 1
  911.       Palette $0,$FFF
  912.       Cls 0
  913.       Pen 1 : Paper 0
  914.       Locate 33,15
  915.       Print "Loading music..."
  916.       Track Load F$,7
  917.       MUSBANK=1
  918.       MUZAK=1
  919.       Track Loop On 
  920.       Track Play 
  921.       Screen Close 3
  922.    End If 
  923. End Proc
  924. Procedure MUZAKMENU
  925.    Every Off 
  926.    STILLPRESSED:
  927.    If Key State(69)=True Then Goto STILLPRESSED
  928.    Screen 2
  929.    Get Block 321,0,0,640,8
  930.    Colour 0,$B00
  931.    Cls 0
  932.    Paper 0
  933.    Locate 0,0
  934.    Pen 3 : Print " MUSIC MENU:";
  935.    Pen 3 : Print "  C"; : Pen 2 : Print " (Change/Load Music)";
  936.    Pen 3 : Print "  S"; : Pen 2 : Print " (Stop Music)";
  937.    Pen 3 : Print "  P"; : Pen 2 : Print " (Play Music)";
  938.    If MUZAK=-1 Then Bell : Wait 10
  939.    Do 
  940.       THERE:
  941.       Rem Change music 
  942.       If Key State(51)
  943.          MUZAK=1
  944.          MUZAKCHANGE=1
  945.          Screen Hide 2
  946.          Proc MUZAKPLAY
  947.          Screen 2
  948.          Colour 0,$337
  949.          Put Block 321,0,0
  950.          Every On 
  951.          Screen Show 2
  952.          MUZAKCHANGE=-1
  953.          Screen 0
  954.          Limit Mouse X Hard(2),Y Hard(1) To X Hard((320*RES)-2),Y Hard(255)
  955.          Pop Proc
  956.       End If 
  957.       Rem stop music 
  958.       If Key State(33)
  959.          Track Stop 
  960.          MUZAK=-1
  961.          Colour 0,$337
  962.          Put Block 321,0,0
  963.          Bell 
  964.          Every On 
  965.          Pop Proc
  966.          Screen 0
  967.          Limit Mouse X Hard(2),Y Hard(1) To X Hard((320*RES)-2),Y Hard(255)
  968.       End If 
  969.       Rem Play music 
  970.       If Key State(25)
  971.          If Length(7)=0
  972.             Cls 
  973.             Pen 2 : Print "No music loaded - Use (Change/Load Music) option";
  974.             Wait 100
  975.             Bell 
  976.          End If 
  977.          If MUZAK=-1
  978.             Track Play 
  979.             MUZAK=1
  980.          End If 
  981.          Colour 0,$337
  982.          Put Block 321,0,0
  983.          Every On 
  984.          Screen 0
  985.          Limit Mouse X Hard(2),Y Hard(1) To X Hard((320*RES)-2),Y Hard(255)
  986.          Pop Proc
  987.       End If 
  988.    Loop 
  989. End Proc
  990. Procedure FILELOAD
  991.    On Error Proc CORRECT
  992.    Screen Open 3,320,256,2,Lowres
  993.    Curs Off 
  994.    Proc MOVE_SCREEN[3,0,-4]
  995.    Set Rainbow 0,1,280,"","","(9,1,15)(9,-1,15)"
  996.    Rainbow 0,0,40,280
  997.    FILELOAD:
  998.    Clear Key 
  999.    Dir$="sys:"
  1000.    F$=Fsel$("*.picpuz","","Load a saved Puzzle","Select a '.picpuz file")
  1001.    If F$=""
  1002.       OLD=-1 : Pop Proc
  1003.    End If 
  1004.    If Exist(F$)=False Then Goto FILELOAD
  1005.    If Right$(F$,6)<>"picpuz" Then Goto FILELOAD
  1006.    Rainbow Del 0
  1007.    Screen Close 3
  1008.    Open In 1,F$
  1009.    Input #1,TILES
  1010.    Input #1,TILES$
  1011.    Input #1,MOVES
  1012.    Input #1,PCOUNTER
  1013.    Input #1,PCOUNT
  1014.    Input #1,TIME
  1015.    Input #1,OLDTTIME
  1016.    Input #1,VERT
  1017.    Input #1,HORIZ
  1018.    Input #1,SEC
  1019.    Input #1,WHOLEMIN
  1020.    Input #1,HOUR
  1021.    Input #1,PIC$
  1022.    For A=1 To TILES
  1023.       Input #1,PUZZLE(A)
  1024.       Input #1,VFLIP(A)
  1025.       Input #1,HFLIP(A)
  1026.    Next 
  1027.    Close 1
  1028.    Proc TILESDATA
  1029.    Proc TIMECALC
  1030.    OLD=1
  1031. End Proc
  1032. Procedure SIZE
  1033.    Screen 1
  1034.    SCRW=Screen Width
  1035.    SCRH=Screen Height
  1036.    COULS=Screen Colour
  1037.    If SCRW>430
  1038.       RESOLUTION=$8000
  1039.       RES=2
  1040.    Else 
  1041.       RESOLUTION=0
  1042.       RES=1
  1043.    End If 
  1044.    Proc TILESDATA
  1045.    If SCRW=320 and SCRH=256 or SCRW=640 and SCRH=256 Then Goto HERE
  1046.    Screen Open 4,640,256,4,Hires
  1047.    Proc MOVE_SCREEN[4,0,-4]
  1048.    Paper 0 : Pen 2 : Curs Off 
  1049.    Cls 0
  1050.    Locate 15,15
  1051.    Print "Please wait whilst picture size is adjusted....";
  1052.    View 
  1053.    Screen Open 3,320*RES,256,COULS,RESOLUTION
  1054.    Curs Off 
  1055.    Screen Hide 3
  1056.    Proc MOVE_SCREEN[3,0,-4]
  1057.    Get Palette 1 : Flash Off : Curs Off 
  1058.    Zoom 1,0,0,SCRW,SCRH To 3,0,0,320*RES,256
  1059.    Screen Close 1
  1060.    Screen Open 1,320*RES,256,COULS,RESOLUTION
  1061.    Screen Hide 1
  1062.    Proc MOVE_SCREEN[1,0,-4]
  1063.    Get Palette 3
  1064.    Flash Off : Curs Off 
  1065.    Screen Copy 3 To 1
  1066.    Screen Close 3
  1067.    Screen Close 4
  1068.    HERE:
  1069. End Proc
  1070. Procedure CORRECT
  1071.    Erase 7
  1072.    Erase 1
  1073.    F=Free
  1074.    Every Off 
  1075.    Resume Next 
  1076. End Proc
  1077. Procedure TIMECALC
  1078.    If TIME<>0 Then Goto HERE
  1079.    TTIME=0
  1080.    If TILES=4 Then TTIME=2
  1081.    If TILES=8 Then TTIME=5
  1082.    If TILES=20 Then TTIME=25
  1083.    If TILES=40 Then TTIME=75
  1084.    If TILES=80 Then TTIME=150
  1085.    If TILES=160 Then TTIME=540
  1086.    If TILES=320 Then TTIME=1800
  1087.    If VERT=1 Then TTIME=(TTIME*1.25)+1
  1088.    If HORIZ=1 Then TTIME=(TTIME*1.25)+1
  1089.    If PCOUNTER=5 Then TTIME=TTIME*1.05
  1090.    If PCOUNTER=4 Then TTIME=TTIME*1.1
  1091.    If PCOUNTER=3 Then TTIME=TTIME*1.2
  1092.    If PCOUNTER=2 Then TTIME=TTIME*1.3
  1093.    If PCOUNTER=1 Then TTIME=TTIME*1.5
  1094.    If PCOUNTER=0 Then TTIME=TTIME*3
  1095.    TTIME=TTIME-OLDTTIME
  1096.    FINHOUR=TTIME/3600
  1097.    FINWHOLEMIN=(TTIME-3600*FINHOUR)/60
  1098.    FINSEC=TTIME-((FINHOUR*3600)+(FINWHOLEMIN*60))
  1099.    HERE:
  1100. End Proc
  1101. Procedure OUTOFTIME
  1102.    Hide On 
  1103.    Screen 0
  1104.    Ink 1,1
  1105.    Bar 68*RES,80 To 255*RES,155
  1106.    Ink 2
  1107.    Set Font 3
  1108.    Gr Writing 0
  1109.    C$="SORRY!"
  1110.    If RES=1 Then Text 118*RES,110,C$
  1111.    If RES=2 Then Text 142*RES,110,C$
  1112.    C$="OUT OF TIME!!!"
  1113.    If RES=1 Then Text 80*RES,140,C$
  1114.    If RES=2 Then Text 122*RES,140,C$
  1115.    Screen Swap : Wait Vbl 
  1116.    Screen Copy Physic To Logic
  1117.    Screen Swap : Wait Vbl 
  1118.    Set Font 1
  1119.    Gr Writing 1
  1120.    If MUZAK=-1
  1121.       For W=9 To 1 Step -1
  1122.          Bell W
  1123.          Wait 6
  1124.       Next 
  1125.       Wait 1
  1126.    End If 
  1127.    Do 
  1128.       If Mouse Click=1 Then Exit 
  1129.    Loop 
  1130.    If MUZAK=1 Then Track Play 
  1131.    Screen Close 1
  1132.    Screen Close 2
  1133.    Fade 1 : Wait 16
  1134.    Screen Close 0
  1135.    WIN=1
  1136.    Clear Key 
  1137. End Proc